package algo3.algothief.modelo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public abstract class RangoPolicia {
	
	protected String nombreDelRango;
	
	protected int cantidadDeArrestosActual;
	protected int cantidadDeArrestosParaPromocion;
	
	protected double velocidadDeViaje; // En km por hora

//-------------------------------------------------------------------------------------	

	public abstract ObjetoRobado definirObjetoQueSeRobara();
	
	public abstract String pedirPista(LugarDePais lugar);
	
	protected abstract RangoPolicia promoverRango();
	
//-------------------------------------------------------------------------------------

	// La descripcion extra es para saber a que pais se refiere dentro del archivo.
	
	public Element serializar(Document doc, String descripcionExtra) {
		Element elementoRango = doc.createElement("RangoPolicia" + descripcionExtra);
		
		Element elementoCantidadDeArrestos = doc.createElement("CantidadDeArrestos");
		elementoCantidadDeArrestos.setAttribute("arrestos", Integer.toString(cantidadDeArrestosActual));
		
		elementoRango.appendChild(elementoCantidadDeArrestos);
					
		return elementoRango;
	}
		
	public static RangoPolicia hidratar(Document doc, String descripcionExtra) {
		Element elementoRango = (Element)doc.getElementsByTagName("RangoPolicia" + descripcionExtra).item(0);
		
		Element elementoCantidadDeArrestos = (Element)elementoRango.getElementsByTagName("CantidadDeArrestos").item(0);
		String cantidadDeArrestosEnFormaDeString = elementoCantidadDeArrestos.getAttribute("arrestos");
		int cantidadDeArrestos = Integer.parseInt(cantidadDeArrestosEnFormaDeString);
		
		RangoPolicia rangoNuevo = new RangoNovato();
		rangoNuevo = rangoNuevo.intentarPromoverElRango(cantidadDeArrestos);
		
		return rangoNuevo;
	}
	
//-------------------------------------------------------------------------------------

	protected boolean debePromocionar() {
		if (this.cantidadDeArrestosActual >= this.cantidadDeArrestosParaPromocion) return true;
		return false;
	}
	
//-------------------------------------------------------------------------------------
	
	public String verNombre() {
		return this.nombreDelRango;
	}
	
	public RangoPolicia intentarPromoverElRango(int cantidadDeArrestosNuevos) {
		this.cantidadDeArrestosActual += cantidadDeArrestosNuevos;
		
		boolean debePromocionarRango = this.debePromocionar();
		
		if (debePromocionarRango) {
			RangoPolicia rangoPromocionado = this.promoverRango();
			int cantidadDeArrestosExcedente = this.cantidadDeArrestosActual - this.cantidadDeArrestosParaPromocion;
			
			return ( rangoPromocionado.intentarPromoverElRango(cantidadDeArrestosExcedente) );
		}
		
		return this;
	}
	
	public int verCantidadDeArrestosActual() {
		return this.cantidadDeArrestosActual;
	}
	
	public int verCuantosArrestosFaltanParaPromocion() {
		int arrestosFaltantes = (cantidadDeArrestosParaPromocion - cantidadDeArrestosActual);
		if (arrestosFaltantes > 0) return arrestosFaltantes;
		return 0;
	}
	
	public double verVelocidadDeViaje() {
		return this.velocidadDeViaje;
	}
}
